/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pua.uniandes.entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author jd.velasquez3209
 */
public class Mision implements Serializable {

    private static final String TEMPERATURA = "temperatura";
    private static final String POTENCIA = "potencia";
    private static final String ALTURA = "altura";
    private static final String ACELERACIONY = "aceleraciony";
    private static final String ACELERACIONX = "aceleracionx";
    private static final String ACELERACIONZ = "aceleracionz";
// ----------------------------------------------------------
// Atributos
// ----------------------------------------------------------
    private boolean enOperacion;
    private Date fechaCreacion;
    private Date fechaDespegue;
    private Date fechaFin;
    private String nombreMision;
    private String nombreCohete;
    private ArrayList<TramaDatos> tramas;

    // ----------------------------------------------------------------------
// Constructor
// ----------------------------------------------------------------------
    public Mision(String nombreMision, String nombreCohete, Date fechaCreacion) {
        this.nombreMision = nombreMision;
        this.nombreCohete = nombreCohete;
        this.fechaCreacion = fechaCreacion;
        tramas = new ArrayList<TramaDatos>();
        fechaFin=new Date(2015, 9, 4);
        fechaDespegue=fechaCreacion;

    }

// ----------------------------------------------------------------------
// Metodos
// ----------------------------------------------------------------------
    public void calcularDatosAnalisis() {
    }

    public void guardarTrama(double aceleracionX, double aceleracionY, double aceleracionZ, double altura, double potencia, double temperatura, Date tiempo) {
        System.out.println("Estoy en MISION");
        System.out.println("Estoy en MISION: "+tramas.toString());
        TramaDatos t = new TramaDatos(tramas.size(), aceleracionX, aceleracionY, aceleracionZ, altura, potencia, temperatura, tiempo);
        tramas.add(t);
    }

    public String[] getDatosAnalisis() {

        String[] datosAnalisis = new String[17];


        datosAnalisis[0] = nombreMision;
        System.out.println("mision"+nombreMision);
        datosAnalisis[1] = fechaCreacion.toString();
        System.out.println("fechacreacion"+fechaCreacion);
        datosAnalisis[2] = nombreCohete;
        datosAnalisis[3] = (fechaFin.getTime() - fechaDespegue.getTime()) + "";
        datosAnalisis[4] = fechaDespegue.toString();
        double promedio = getPromedio(ACELERACIONX);
        datosAnalisis[5] = promedio + "";
        datosAnalisis[6] = getDesviacionEstandar(ACELERACIONX, promedio) + "";
        promedio = getPromedio(ACELERACIONY);
        datosAnalisis[7] = promedio + "";
        datosAnalisis[8] = getDesviacionEstandar(ACELERACIONY, promedio) + "";
        promedio = getPromedio(ACELERACIONZ);
        datosAnalisis[9] = promedio + "";
        datosAnalisis[10] = getDesviacionEstandar(ACELERACIONZ, promedio) + "";
        promedio = getPromedio(POTENCIA);
        datosAnalisis[11] = promedio + "";
        datosAnalisis[12] = getDesviacionEstandar(POTENCIA, promedio) + "";
        promedio = getPromedio(ALTURA);
        datosAnalisis[13] = promedio + "";
        datosAnalisis[14] = getDesviacionEstandar(ALTURA, promedio) + "";
        promedio = getPromedio(TEMPERATURA);
        datosAnalisis[15] = promedio + "";
        datosAnalisis[16] = getDesviacionEstandar(TEMPERATURA, promedio) + "";
        return datosAnalisis;


    }

    private double getDesviacionEstandar(String variable, double promedio) {


        double desviacion = 0;

        if (variable.equals(ACELERACIONX)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getAceleracionX() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();


        } else if (variable.equals(ACELERACIONY)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getAceleracionY() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();



        } else if (variable.equals(ACELERACIONZ)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getAceleracionZ() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();


        } else if (variable.equals(POTENCIA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getPotencia() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();



        } else if (variable.equals(TEMPERATURA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getTemperatura() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();



        } else if (variable.equals(ALTURA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                desviacion += Math.pow(tramaDatos.getAltura() - promedio, 2);

            }

            desviacion = desviacion / tramas.size();



        }

        return desviacion;

    }

    private double getPromedio(String variable) {

        double promedio = 0;

        if (variable.equals(ACELERACIONX)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getAceleracionX();

            }

            promedio = promedio / tramas.size();


        } else if (variable.equals(ACELERACIONY)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getAceleracionY();

            }

            promedio = promedio / tramas.size();



        } else if (variable.equals(ACELERACIONZ)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getAceleracionZ();

            }

            promedio = promedio / tramas.size();



        } else if (variable.equals(POTENCIA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getPotencia();

            }

            promedio = promedio / tramas.size();



        } else if (variable.equals(TEMPERATURA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getTemperatura();

            }

            promedio = promedio / tramas.size();



        } else if (variable.equals(ALTURA)) {

            for (int i = 0; i < tramas.size(); i++) {
                TramaDatos tramaDatos = tramas.get(i);
                promedio += tramaDatos.getAltura();

            }

            promedio = promedio / tramas.size();



        }

        return promedio;

    }

// ----------------------------------------------------------
// Getters y setters
// ----------------------------------------------------------
    public boolean isEnOperacion() {
        return enOperacion;
    }

    public void setEnOperacion(boolean enOperacion) {
        this.enOperacion = enOperacion;
    }

    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    public Date getFechaDespegue() {
        return fechaDespegue;
    }

    public void setFechaDespegue(Date fechaDespegue) {
        this.fechaDespegue = fechaDespegue;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public ArrayList<TramaDatos> getTramas() {
        return tramas;
    }

    public void setTramas(ArrayList<TramaDatos> tramas) {
        this.tramas = tramas;
    }

    public String getNombreCohete() {
        return nombreCohete;
    }

    public void setNombreCohete(String nombreCohete) {
        this.nombreCohete = nombreCohete;
    }

    public String getNombreMision() {
        return nombreMision;
    }

    public void setNombreMision(String nombreMision) {
        this.nombreMision = nombreMision;
    }
}
